<?php

/**
 * [文件上传]
 * @param  class [Upload]
 */
class Upload
{
	// 创建上传文件的全局变量  文件目录 文件大小 文件类型
	public $dir;
	// 设置文件的大小
	public $allowSize=2000000;
	//设置文件的类型
	public $allowType = array('jpg','gif','png','jpeg','txt');
	// 利用构造方法 初始化文件
	/**
	 * [构造函数初始化]
	 * @param [type] $dir      [存储目录]
	 * @param string $filesize [允许大小]
	 * @param array  $filetype [允许类型]
	 */
	public function __construct($dir=null,$allowSize='',$allowType=array())
	{	
		//一：初始化上传目录
		
		$this->setUploadDir($dir);

		// 如果文件大小不为空那么就初始化文件大小
		if(!empty($allowSize))$this->allowSize=$allowSize;
		//如果文件类型不为空那么就初始化文件类型
		if(!empty($allowType))$this->allowType=$allowType;
		

	}

	/**
	 * [一、设置文件上传目录]
	 * @param [type] $dir [description]
	 */
	private function setUploadDir($dir){
		//如果没有目录 那么就配置一个上传的目录
		if(empty($dir))$this->dir='upload/'.date("Y/m/d");
		// 是否是目录 不是目录就创建一个目录
		is_dir($this->dir) or mkdir($this->dir,0755,true);

	}
	
	/**
	 * [二、上传文件]
	 * @return [type] [description]
	 */
	public function upload(){
		//①、表单数据统一
		$files = $this->format();
		//②文件合法性检验
		$files = $this->check($files);
		//③移动文件 到目标目录
		$files = $this->moveFile($files);

		return $files;
	}

	/**
	 * [①、将上传的数据表单统一] 
	 * 
	 * @return [type] [description]
	 */
	private function format(){
		$data = array();
		foreach ($_FILES as $file) {
			if(is_array($file['name'])){
				foreach ($file['name'] as $id => $value) {
					// 统一文件数据表单格式
					$tmp['name']=$file['name'][$id];
					$tmp['type']=$file['type'][$id];
					$tmp['tmp_name']=$file['tmp_name'][$id];
					$tmp['error']=$file['error'][$id];
					$tmp['size']=$file['size'][$id];
					$tmp['time']=time();
					$data[]=$tmp;
				}
			}else{
				// 如果不是数组那么直接把信息压入到$data 里面
				$info = pathinfo($file['name']);
				$data[] = $file;
			}
		}
		return $data;

	}


	/**
	 * [②检验文件的合法性]
	 * @param  [type] $files [description]
	 * @return [type]        [description]
	 */
	private function check($files){
		// 遍历文件
		$data = array();

		foreach ($files as $file) {
			
			// 判断是否是临时文件
			if(!is_uploaded_file($file['tmp_name'])){
				// 没有临时文件返回跳过本次循环
				continue;
			}
			//上传不成功是 跳过
			if($file['error']!=0){
				continue;
			}
			// 上传的大小大于设定的值
			if($file['size']>$this->allowSize){
				continue;
			}

			// 获得文件的详细信息
			$info = pathinfo($file['name']);

			//判断类型后缀是否相符 先把它转换成小写的后缀 不相符 跳出循环
			if(!in_array(strtolower($info['extension']),$this->allowType)){
				continue;
			}

			$data[] = $file;

		}
		return $data;

	}
	
	/**
	 * [③移动文件到目标目录]
	 * @return [type] [description]
	 */
	private function moveFile($files){

		$data = array();
		// 遍历已经整理好的文件
		foreach($files as $file) {
			// 获得文件的详细信息
			$info = pathinfo($file['name']);
			// 设置目标文件路径 存储在服务器上的文件
			$destination = $this->dir.'/'.mt_rand().time().'.'.$info['extension'];
			// 如果上传的目录为零时目录 那么把文件返回到数组中
			if(move_uploaded_file($file['tmp_name'], $destination)){
				$data[] = $file;
			}
			
		}
		return $data;

	}


}
